package com.lpf.singleton;

import java.io.Serializable;

/**
 * Singleton 类确保一个类只有一个实例，并提供一个全局访问点。
 * 该实现使用了“饿汉式”单例模式，在类加载时就创建了唯一的实例。
 */
public class SingletonDemo implements Serializable {

    // 私有的静态实例，防止外部通过 new 创建对象
    private static final SingletonDemo instance = new SingletonDemo();

    /**
     * 私有构造函数，防止外部实例化。
     * 这是单例模式的关键部分，避免其他类通过构造函数创建新的实例。
     */
    private SingletonDemo() {
        // 防止反射攻击
        if (instance != null) {
            throw new RuntimeException("请通过 getInstance() 方法获取唯一实例");
        }
    }

    /**
     * 提供全局访问点以获取唯一实例。
     * @return 返回 SingletonDemo 的唯一实例
     */
    public static SingletonDemo getInstance() {
        return instance;
    }

    /**
     * 示例方法，用于演示单例类的功能。
     */
    public void showMessage() {
        System.out.println("Hello from the Singleton instance!");
    }
    /**
     * 禁用 clone 方法，防止通过克隆创建新实例。
     */
    @Override
    protected Object clone() throws CloneNotSupportedException {
        throw new CloneNotSupportedException("单例模式不支持克隆");
    }

    @Override
    public String toString() {
        return "SingletonDemo{}";
    }

    /**
     * 如果单例类实现了 接口，反序列化时可能会创建新的实例。 `Serializable`
     * 添加 `readResolve()` 方法，确保反序列化时返回唯一的实例。
     * @return
     */
    protected Object readResolve() {
        return instance;
    }
}